package com.ww.springboot.boot.algorithm.leetcode1;

/**
 * 描述：
 * 函数 myAtoi(string s) 的算法如下：
 * <p>
 * 读入字符串并丢弃无用的前导空格
 * 检查下一个字符（假设还未到字符末尾）为正还是负号，读取该字符（如果有）。 确定最终结果是负数还是正数。 如果两者都不存在，则假定结果为正。
 * 读入下一个字符，直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
 * 将前面步骤读入的这些数字转换为整数（即，"123" -> 123， "0032" -> 32）。如果没有读入数字，则整数为 0 。必要时更改符号（从步骤 2 开始）。
 * 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。具体来说，小于 −231 的整数应该被固定为 −231 ，大于 231 − 1 的整数应该被固定为 231 − 1 。
 * 返回整数作为最终结果。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/string-to-integer-atoi
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author 🧑 ‍wanwei
 * @since 2022-03-04 14:39
 */
public class MyAtoi {

    public static void main(String[] args) {
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
        System.out.println(method(""));
    }

    private static Integer method(String s) {
        int n = s.length();
        Boolean flag = true;
        Integer index = 0;
        //去空格
        while (index < n && s.charAt(index) == ' ') {
            index++;
        }
        if (index == n) {
            return 0;
        }
        //判断第一个字符是否正负号
        if (s.charAt(index) == '+') {
            index++;
        } else if (s.charAt(index) == '-') {
            flag = false;
            index++;
        }
        if (index == n) {
            return 0;
        }
        char ch = s.charAt(index);
        Integer i = 0;
        while (ch >= '0' && ch <= '9') {
            int digit = ch - '0';
            if (i > (Integer.MAX_VALUE - digit) / 10) {
                // 本来应该是 ans * 10 + digit > Integer.MAX_VALUE
                // 但是 *10 和 + digit 都有可能越界，所有都移动到右边去就可以了。
                return flag ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            i = i * 10 + digit;
            index++;
            if (index >= n) {
                break;
            }
            ch = s.charAt(index);
        }
        return flag ? i : -i;
    }
}
